package com.tool.generator;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Arrays;
/**
 * @author 酒徒
 * @Version 1.0
 * @data 2024/1/23 12:57
 * 自动生成代码-使用freemark模板
 * 导入四个依赖(代码生成，模板，sql，lombak(实体类注解))，修改mapper模板以生成带有@Mapper注解
 */

/**
 * MyBatis-Plus 代码生成类
 */
public class Generator {
    // TODO 修改服务器IP地址和mysql端口号
    private static final String SERVICE_IP = "localhost";
    private static final String SERVICE_PORT = "3306";

    // TODO: 修改数据库名，数据库账号和数据库密码
    //数据库名
    private static final String SERVICE_NAME = "sky_take_out";

    //数据库账号
    private static final String DATA_SOURCE_USER_NAME = "root";
    //数据库密码
    private static final String DATA_SOURCE_PASSWORD = "root";

    // TODO: 修改所需生成的表名
    //生成的表
    private static final String[] TABLE_NAMES = new String[]{
            "dish",
            "user"
    };

    // TODO 默认生成entity，需要生成DTO修改此变量
    // 一般情况下要先生成 DTO类 然后修改此参数再生成 PO 类。
    private static final Boolean IS_DTO = false;

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator generator = new AutoGenerator();
        // 选择 freemarker 引擎，默认 Velocity
        generator.setTemplateEngine(new FreemarkerTemplateEngine());
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setFileOverride(true);//设置是否覆盖原始生成文件
        //TODO: 代码生成路径
        gc.setOutputDir(System.getProperty("user.dir") + "/tool-type/src/main/java");
        gc.setAuthor("酒徒");//设置作者
        gc.setOpen(false);//设置生成完毕后是否打开生成代码所在的目录
        gc.setSwagger2(false);
        gc.setServiceName("%sService"); //设置服务层接口名，%s为占位符，指代模块名称
        gc.setMapperName("%sMapper"); //设置数据层接口名，%s为占位符，指代模块名称
        gc.setBaseResultMap(true); //是否将父类中的字段映射到 XML 结果映射文件中
        gc.setBaseColumnList(true); //是否将父类中的字段添加到结果 SQL 中

        if (IS_DTO) {
            gc.setSwagger2(true);//生成Swagger2注解，便于接口文档
            gc.setEntityName("%s");
        }
        generator.setGlobalConfig(gc);

        // 数据库配置
        DataSourceConfig data = new DataSourceConfig();
        data.setDbType(DbType.MYSQL);
        data.setUrl("jdbc:mysql://" + SERVICE_IP + ":" + SERVICE_PORT + "/" + SERVICE_NAME
                + "?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8");
//		data.setDriverName("com.mysql.jdbc.Driver"); //mysql5
        data.setDriverName("com.mysql.cj.jdbc.Driver"); //mysql6及以上
        data.setUsername(DATA_SOURCE_USER_NAME);
        data.setPassword(DATA_SOURCE_PASSWORD);
        generator.setDataSource(data);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(SERVICE_NAME);
        pc.setParent("com.tool.generator");//设置生成的包名，与代码所在位置叠加组成完整路径

        pc.setServiceImpl("service.impl");//设置生成的 Service实现类存放的包路径
        pc.setXml("mapper.xml");//设置生成的 XML 文件存放的包路径
        pc.setEntity("entity");//设置实体类名
        generator.setPackageInfo(pc);


        // 设置模板
        TemplateConfig tc = new TemplateConfig();
        generator.setTemplate(tc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel); //设置实体类名的命名策略：下划线转驼峰的命名策略。
        strategy.setColumnNaming(NamingStrategy.underline_to_camel); //设置实体类字段名的命名策略: 下划线转驼峰
        strategy.setEntityLombokModel(true);//设置是否启用Lambda
        strategy.setRestControllerStyle(true);//设置是否使用Rest风格
        strategy.setInclude(TABLE_NAMES);//设置数据库中当前参与生成的包名
        strategy.setControllerMappingHyphenStyle(true);
        //strategy.setVersionFieldName("version");//设置使用乐观锁字段名
        //strategy.setLogicDeleteFieldName("deleted");//设置逻辑删除字段名
        strategy.setTablePrefix(pc.getModuleName() + "_");//设置数据库表的前缀名称模块名=数据库表名-前缀名, pc.getModuleName()获取模块名
        strategy.setEntityBooleanColumnRemoveIsPrefix(true); // Boolean类型字段是否移除is前缀处理 is_deleted => deleted

        // 自动填充字段配置
        strategy.setTableFillList(Arrays.asList(
                new TableFill("create_date", FieldFill.INSERT),//插入操作时进行自动填充字段名
                new TableFill("change_date", FieldFill.INSERT_UPDATE),//插入和更新操作时进行自动填充字段名
                new TableFill("modify_date", FieldFill.UPDATE)//更新操作时进行自动填充字段名
        ));
        generator.setStrategy(strategy);

        generator.execute();
    }

}


